package com.shangma.cn.components;

import com.shangma.cn.entity.Admin;
import com.shangma.cn.mapper.AdminMapper;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import javax.validation.constraints.Email;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 开发者：辉哥
 * 特点： 辉哥很帅
 * 开发时间：2021/6/30 16:06
 * 文件说明：
 * <p>
 * 总结：
 * springTask使用方式 ：
 * 1： 手写
 * CronTrigger trigger = new CronTrigger("0 3 16 30 * *");
 * ThreadPoolTaskScheduler
 * <p>
 * 好处： 手动指定线程池的的大小  手动初始化
 * <p>
 * <p>
 * 2： 使用spring封装的注解
 * 1： 开启任务调度 @EnableScheduling
 * 2： 在容器中的某个类 定义一个方法 在方法中做任务调度做的事情
 * 这个事情什么时候做 需要在这个方法上添加一个注解 @Scheduled 通过这个注解中的配置 cron表达式等
 * 确定这个方法什么时候执行
 * <p>
 * 好处：使用起来简单 2个注解
 * 缺点： 默认的线程池只有一个
 * <p>
 * <p>
 * 解决方案：
 * 1：调度就使用一个线程 但是这个线程做事情 放到子线程去做 此时这个线程不会阻塞
 * 2：修改调度线程池大小
 */
//@Component
public class DemoScheduling {

    /*
     * ssm:
     *   导包   spring-context-support- javaxmail
     *
     *    配置
     *               javaMailSender
     *                 from
     *                 授权码
     *                 smtp服务器
     *
     *      发邮件
     *
     *
     * freemarker怎么使用的
     *      1： 导包   freemarker
     *      2： 配置freemarkerConfiger
     *              配置模板的地址
     *              配置字符编码集
     *
     *      3： 在你的配置的默认地址文件夹中 定义xxx.ftl 格式文件
     *      4:  在这个格式文件中 可变的值 使用${key} 定义
     *
     *      5： 编码读取模板 获取字符串 发送邮件
     *
     *
     * */

//    @Autowired
    private AdminMapper adminMapper;

//    @Autowired
    private EmailService emailService;


    // 定时任务的功能如果是个耗时的操作 放到异步线程池当中做
    // 动态的
    //1个线程
//    @Scheduled(cron = "0 30 16 15 * *")
//    public void doSomeThing() throws Exception {
//        System.out.println(Thread.currentThread().getName());
//        List<Admin> admins = adminMapper.selectList(null);
//        admins.forEach(admin -> {
//            //使用异步线程池来做的
//            emailService.sendMail(admin);
//        });
//        //要给这里面的员工发邮件
//
//    }

    //特点： 自动触发执行  表达式写死了
    // 动态的从数据库中获得数据之后 拿到表达式 手动触发   此时如果想要做到动态 此时 @EnableScheduling+@Scheduled(cron = "0/5 * * * * *")
//    @Scheduled(cron = "0/5 * * * * *")
//    public void doSomeThing1() throws Exception {
//        System.out.println("xxxxxx");
//
//    }


}
